import { defineStore } from 'pinia'
import http from "@/utils/http";
export const useStore = defineStore("pinia", {
  persist: true,//持久化的开关
  state: () => {
    return {
      userId: "",
      name: "",
      //登录用户头像
      photoUrl: "",
      menuChooseIcon: "",//菜单图标的名称，菜单管理组件--新增或修改窗口--图片选择
      defaultPage: "",// 进入主页后的默认页面
      roleList: [],//角色数据
      perStr: "",//权限数据
      hasPlanOperaPermission: false,//是否拥有计划操作权限
      nowPlanOperaUserId: undefined,//当前被验证权限用户
      //菜单右上角提醒消息数量
      badge: {
        ldjd: 0,
      },
      //全员计划 日期选择框被隐藏时用到，点击前一日、后一日按钮改变当前日期
      workDate: undefined,
      userIds:[]
    }
  },
  //类似于computed 可以帮我们去修饰我们的值
  getters: {
    //对头像地址进行格式化处理
    formatPhoto (state) {
      if (state.photoUrl && state.photoUrl.length > 0) {
        //远程调用服务端的图片，加上代理的前缀
        return '/api' + state.photoUrl
      } else {
        return null
      }
    },
    //判断是否拥有指定的角色权限
    hasRolePermission (state) {
      //方便接受参数
      return (roleFlagStr) => {
        // ",zjl,jl,boss" //仅总经理、管理员、老板可以删除
        //判断是否具有项目计划的权限
        let flag = false;
        //从pinia获取角色数据
        let arr = state.roleList
        if (arr.length > 0) {
          for (let i = 0; i < arr.length; i++) {
            //仅总经理、管理员、老板可以删除
            if (roleFlagStr.indexOf(arr[i].flag) > 0) {
              return true;
            }
          }
        }
        return flag;
      }
    },
    hasProjectPlanEditPersission (state) {
      // //判断是否具有项目计划的权限
      //方便接受参数
      return (userIds = []) => {
        let flag = false;
        //检查当前用户是否项目负责人
        if (userIds.indexOf(state.userId) > -1) {
          flag = true;
        }
        //检查当前用户是否boss,admin
        if (flag == false) {
          flag = this.hasRolePermission(",admin,boss");
        }
        return flag;
      }
    },
    //是否具有hr角色
    hasRoleHr () {
      if (this.hasRolePermission(",hr")) {
        return true;
      }
      return false;
    },
    //是否具有admin角色
    hasRoleAdmin () {
      if (this.hasRolePermission(",admin")) {
        return true;
      }
      return false;
    },
    //是否具有boss角色
    hasRoleBoss () {
      if (this.hasRolePermission(",boss")) {
        return true;
      }
      return false;
    },
  },
  //可以操作异步 和 同步提交state
  //actions里调用异步服务后，不要用箭头函数接收返回，this会出问题
  actions: {
    //是否是特定角色
    isOnlyRole (flag) {
      let roleList = this.roleList;
      if (roleList.length == 1 && roleList[0].flag == flag) {
        return true;
      } else {
        return false;
      }
    },
    logout () {
      //清除头部tag
      useTagsViewStore().visitedViews = []
      useTagsViewStore().cachedViews = []

      //退出时的统一处理方法，以下组件用到
      //1、axios.js 
      //2、view--layout--header--avator.vue
      this.photoUrl = ""
      //重置到初始路由
      this.defaultPage = "/index/welcome"
      //清除上一个被鉴权对象
      this.nowPlanOperaUserId = undefined;
      localStorage.setItem("pinia", "")
      //清除本地存储的数据
      localStorage.clear();
      sessionStorage.clear();
      //弹到登录页
      router.replace("/login")
    },
    getRoles () {
      //获取当前用户的所有角色
      //使用文件：views\contract\checkHis.vue
      http.get("/role/mine", {}).then((res) => {
        if (res && res.code == 1) {
          this.roleList = res.data
        }
      });
    },

    //获取用户操作权限
    async getPlanOperaPermission (userId) {
      if (this.nowPlanOperaUserId === userId) {
        // console.log('-----同一个用户不用鉴权---');
        return
      }
      this.nowPlanOperaUserId = userId
      let res = await http.post("depart/principalOpera", { userId: userId });
      // console.log(userId, "获取操作权限", res);
      if (res && res.code == 1) {
        this.hasPlanOperaPermission = res.data;
      } else {
        this.hasPlanOperaPermission = false;
      }
    },
    //判断用户是否部门负责人
    async checkUserIsDepartPrincipal (userId) {
      let res = await http.post("depart/isPrincipal", { userId: userId });
      if (res && res.code == 1) {
        if (res.myDepart) {
          return true;
        } else {
          return false;
        }
      } else {
        return false;
      }
    },
    //领导交代的消息数量
    async getMsgLdjd () {
      let res = await http.post("/leaderTask/remind");
      if (res && res.code == 1) {
        // this.badge.ldjd = res.data;
      }
    }
  }

})